//
// 哈希表
// https://blog.csdn.net/weixin_40331034/article/details/79461705
// Created by 麻再挺 on 2021/12/20.
//

#ifndef DATA_STRUCTURE_C_HASH_SEARCH_H
#define DATA_STRUCTURE_C_HASH_SEARCH_H

#include <stdio.h>
#include "./../constant.h"

#define __TestHead__ printf("\n-----------------------%s--------------------------\n",__FUNCTION__);

/**
 * 哈希表的最大容量
 */
#define HASH_MAX_SIZE 100
/**
 * 负载因子, 用于表示哈希表的负载能力
 */
#define LOAD_FACTOR 0.8

// 键类型
typedef int HashKeyType;
// 值类型
typedef int HashValueType;

//// 重定义哈希函数
typedef size_t (*HashFunc)(HashKeyType key);

// 表示元素状态
typedef enum Stat {
    Empty, // 空, 当前没有值
    Valid, // 有效, 当前的值有效
    InValid // 非空但无效, 表示当前结点被删除
} Stat;

// 哈希元素的结构体
typedef struct HashElem {
    HashKeyType key; // 键
    HashValueType value; // 值
    Stat stat; // 状态
} HashElem;

// 哈希表
typedef struct HashTable {
    // 哈希数据
    HashElem data[HASH_MAX_SIZE];
    // 当前有效的元素个数
    int size;
    // 哈希函数
    HashFunc hashFunc;
} HashTable;


/**
 * 哈希表初始化
 * @param ht 哈希表
 */
void Hash_Table_Init(HashTable *ht);

/**
 * 哈希表插入元素
 * @param ht 哈希表
 * @param key 键
 * @param value 值
 * @return
 */
int Hash_Table_Insert(HashTable *ht, HashKeyType key, HashValueType value);

/**
 * 哈希表查找, 找到返回 1，并返回结点的值；未找到返回 0
 * @param ht 哈希表
 * @param key 键
 * @param value 值
 * @param cur 位置
 * @return
 */
int Hash_Table_Find(HashTable *ht, HashKeyType key, HashValueType *value);

/**
 * 哈希表删除数据
 * @param ht 哈希表
 * @param key 键
 */
void Hash_Table_Remove(HashTable *ht, HashKeyType key);

/**
 * 判断哈希表是否为空
 * @param ht 哈希表
 */
Status Hash_Table_Empty(HashTable *ht);

/**
 * 计算哈希表大小
 * @param ht 哈希表
 * @return
 */
size_t Hash_Table_Size(HashTable *ht);

/**
 * 打印哈希表内容
 * @param ht 哈希表
 */
void Hash_Table_Print(HashTable *ht);

#endif //DATA_STRUCTURE_C_HASH_SEARCH_H













